// hdu3068
// 题意：
// 给定一个长度为len(<=110000)的字符串，求最长回文子串长度。
//
// 题解：
// 马拉车(manacher)模板题，这里d1[i]表示以i为中心奇数长度的回文半径，
// d2[i]表示以i(i是中间两个的后一个)为中心偶数长度的回文半径。
// 复杂度O(n)。
//
#include <iostream>
#include <algorithm>
#include <string>

int const maxn = 110007;

namespace manacher
{
	// d1 for odd len and d2 for even len
	int d1[maxn];
	int d2[maxn];
	int maxlen;

	void manacher(std::string const& s)
	{
		int n = s.size();
		int l = 0, r = -1;
		maxlen = 0;
		for (int i = 0; i < n; i++) {
			int k = (i > r ? 0 : std::min(d1[l + r - i], r - i)) + 1;
			while (i + k < n && i - k >= 0 && s[i + k] == s[i - k]) k++;
			d1[i] = --k; // origin: d1[i] = k--;
			maxlen = std::max(maxlen, d1[i] * 2 + 1);
			if (i + k > r) { l = i - k; r = i + k; }
		}

		l = 0; r = -1;
		for (int i = 0; i < n; i++) {
			int k = (i > r ? 0 : std::min(d2[l + r - i + 1], r - i + 1)) + 1;
			while (i + k - 1 < n && i - k >= 0 && s[i + k - 1] == s[i - k]) k++;
			d2[i] = --k;
			maxlen = std::max(maxlen, d2[i] * 2);
			if (i + k - 1 > r) { l = i - k; r = i + k - 1; }
		}

		/* for (int i = 0; i < n; i++) std::cout << d1[i] << " " << d2[i] << "\n"; */
	}

	int max_sub_palindrome()
	{
		return maxlen;
	}
}

int main()
{
	std::ios_base::sync_with_stdio(false);
	std::string s;
	while (std::cin >> s) {
		manacher::manacher(s);
		std::cout << manacher::max_sub_palindrome() << "\n";
	}
}

